package StackOrQueue;//给定一个循环数组（最后一个元素的下一个元素是数组的第一个元素），
// 输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序，这个数字之后的第
//一个比它更大的数，这意味着你应该循环地搜索它的下一个更大的数。如果不存在，则输出 -1。 
//
// 示例 1: 
//
// 
//输入: [1,2,1]
//输出: [2,-1,2]
//解释: 第一个 1 的下一个更大的数是 2；
//数字 2 找不到下一个更大的数； 
//第二个 1 的下一个最大的数需要循环搜索，结果也是 2。
// 
//
// 注意: 输入数组的长度不会超过 10000。 
// Related Topics 栈 数组 单调栈 👍 513 👎 0


import java.util.Stack;

//leetcode submit region begin(Prohibit modification and deletion)
class nextGreaterElements {
    public int[] nextGreaterElements(int[] nums) {
        /**
         * 循环数组，即在遍历时，可以遍历两遍，即
         * 数组长度为len ,遍历时 i<2*len,  取值时取 i%len
         * */
        Stack<Integer> stack = new Stack<>();  //单调栈中存下标
        int len = nums.length;
        int[] res = new int[len];
        for (int i = 0; i < len; i++) {
            res[i] = -1;
        }
        for (int i = 0; i < 2 * len; i++) {
            while(!stack.isEmpty() && nums[stack.peek()] < nums[i%len]){
                int index = stack.pop();
                res[index] = nums[i%len];
            }
            stack.push(i%len);
        }
        return res;

    }
}
//leetcode submit region end(Prohibit modification and deletion)
